[Android]暗码机制


今天客户邮件过来一段代码让我加一下,说是用暗码启动MainActivity。


    
    

因为之前改过Dialer,定制过相关的暗码功能,所以没多想就直接把intent-filter加在MainActivity中了。然后测试告诉我,输入”*#*#368222#*#*“不起作用。嗯?

后来一想,好像哪里不太一样,Telephony.SECRET_CODE 好像是系统定义的,不是定制的。然后扒拉一下源码:

packages/apps/Dialer/java/com/android/dialer/app/SpecialCharSequenceMgr.java

  /**
   * Handles secret codes to launch arbitrary activities in the form of *#*##*#*.
   *
   * @param context the context to use
   * @param input the text to check for a secret code in
   * @return true if a secret code was encountered and handled
   */
  static boolean handleSecretCode(Context context, String input) {
    // Secret codes are accessed by dialing *#*##*#*

    int len = input.length();
    if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) {
      return false;
    }
    String secretCode = input.substring(4, len - 4);
    TelephonyManagerCompat.handleSecretCode(context, secretCode);
    return true;
  }

packages/apps/Dialer/java/com/android/contacts/common/compat/TelephonyManagerCompat.java

  /**
   * Handles secret codes to launch arbitrary activities.
   *
   * @param context the context to use
   * @param secretCode the secret code without the "*#*#" prefix and "#*#*" suffix
   */
  public static void handleSecretCode(Context context, String secretCode) {
    // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.
    if (BuildCompat.isAtLeastO()) {
      context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
    } else {
      // System service call is not supported pre-O, so must use a broadcast for N-.
      Intent intent =
          new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode));
      context.sendBroadcast(intent);
    }
  }

嗯,原来*#*##*#* 是定义好的暗码前后缀,拿到暗码之后,发送了一个广播。

所以需要创建一个receiver来handle这个广播:

public class SecretCodeReceiver extends BroadcastReceiver {

    private static final String TAG = "SecretCodeReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d(TAG, "Action = " + action);

        Intent i = new Intent(Intent.ACTION_MAIN);
        i.setClass(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);

    }
}

然后把intent-filter放在这个receiver中间


    
    
    
    

emmmm…好了

发现系统这一套暗码机制还挺好用的,也不理解客户之前为何还要定制一套暗码。


文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录
Copyright © 2015 Wossoneri | Powered by Hexo | Theme Matery
 总访问量:  次  总访问人数:  人
载入运行时间...